package com.gaga.common.utils;

/**
 * @DESCRIPTION:
 * @USER: ningxiang
 * @DATE: 4/27/2025 1:41 PM
 */

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

public class DirectoryCleaner {

    /**
     * 删除指定目录下的所有内容（保留目录本身）
     *
     * @param rootDir 需要清空的目录路径
     * @throws IOException 路径不存在或权限不足时抛出
     */
    public static void cleanDirectory(Path rootDir) throws IOException {
        // 校验路径合法性
        if (!Files.exists(rootDir)) {
            throw new NoSuchFileException("路径不存在: " + rootDir);
        }
        if (!Files.isDirectory(rootDir)) {
            throw new NotDirectoryException("目标不是目录: " + rootDir);
        }

        // 遍历并删除所有子内容
        Files.walkFileTree(rootDir, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
                    throws IOException {
                deleteForce(file); // 删除文件
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException exc)
                    throws IOException {
                if (exc != null) throw exc;
                // 不删除根目录
                if (!dir.equals(rootDir)) {
                    deleteForce(dir); // 删除子目录
                }
                return FileVisitResult.CONTINUE;
            }

            private void deleteForce(Path path) throws IOException {
                try {
                    Files.delete(path);
                } catch (AccessDeniedException e) {
                    // Windows系统需解除只读属性
                    if (path.toFile().setWritable(true)) {
                        Files.delete(path);
                    } else {
                        throw e;
                    }
                }
            }
        });
    }
}